#!/usr/bin/env python3
# -*- coding: utf-8 -*-


# 导入驱动webdriver，即浏览器控制器
from selenium import webdriver
# 判断一个元素是否存在，如何判断alert弹窗出来了，如何判断动态的元素等等一系列的判断，
# 在selenium的expected_conditions模块收集了一系列的场景判断方法
from selenium.webdriver.support import expected_conditions as EC
# By是selenium中内置的一个class，在这个class中有各种方法来定位元素
from selenium.webdriver.common.by import By
# 设置浏览器驱动休眠等待，避免频繁操作封ip
from selenium.webdriver.support.ui import WebDriverWait

# 实例化一个用于控制Chrome的控制器(selenium还可以控制其他浏览器)
driver = webdriver.Chrome()
# 访问该网站
driver.get('https://www.jd.com')
# 窗口最大化，防止小弹窗阻挡
driver.maximize_window()

# 获取搜索输入框和搜索确认框
search_input = driver.find_element_by_id("key")
search_btn = driver.find_element_by_css_selector("#search button.button")

# 向搜索输入框内键入搜索内容
search_input.send_keys("联想正方康特专卖店")
# 点击搜索确认按钮
search_btn.click()

# 定义一个等待对象，设置最长等待时长为120s
wait = WebDriverWait(driver, 120)


def crawl_page():
    # 等待CSS_SELECTOR选择器指定的内容完成加载
    wait.until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, "li.gl-item")
        )
    )
    # 模拟滚动页面到最后的过程
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    # 等待第40个商品加载出来以确保二次加载完成
    wait.until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, '#J_goodsList ul li:nth-child(40)')
        )
    )
    # 记录当前页面商品数量
    count = 1
    books = driver.find_elements_by_css_selector("li.gl-item")
    for book in books:
        product = {}
        product['index'] = count

        # 点击商品标签
        book.find_element_by_css_selector('a').click()

        # 切换到浏览器的第二个标签页
        driver.switch_to.window(driver.window_handles[1])

        # 等待评论总数加载完成
        comment_cnt = wait.until(
            EC.presence_of_element_located(
                (By.CSS_SELECTOR, '#comment-count a')
            )
        )
        #商品URL
        print(driver.current_url)
        # 商品名称
        title = driver.find_element_by_css_selector(".sku-name")
        #jdprice = driver.find_element_by_css_selector(".p-price")
        #saller = driver.find_element_by_css_selector(".J-hove-wrap")
        #product['commit'] = comment_cnt.text
        product['name'] = title.text
        #product['price'] = jdprice.text
        #product['shop'] = saller.text

        # 点击总评论数部分
        comment_cnt.click()
        # 等待好评率加载完成
        comment_good_ratio = wait.until(
            EC.presence_of_element_located(
                (By.CSS_SELECTOR, "#comment .percent-con")))
        #product['FavoriteRate'] = comment_good_ratio.text

        # 关闭当前标签
        driver.close()
        # 回到初始标签
        driver.switch_to.window(driver.window_handles[0])
        # 商品数量加一
        count = count + 1
        print(product)


def main():
    for i in range(1, 20):
        if i != 1:
            wait.until(
                EC.presence_of_all_elements_located(
                    (By.CSS_SELECTOR, "li.gl-item")
                )
            )
            # 模拟点击下一页按钮
            next_btn = driver.find_element_by_css_selector("a.pn-next")
            next_btn.click()
            # 判断翻页成功的标准是当前页面标签的文本内容是翻页后的页码
            wait.until(
                EC.text_to_be_present_in_element(
                    (By.CSS_SELECTOR, '#J_bottomPage a.curr'), str(i)
                )
            )
        crawl_page()


if __name__ == "__main__":
    main()